#include <iostream>
#include <sw/redis++/redis++.h>
#include <vector>
#include <thread>
#include <chrono>
#include "util.hpp"
using namespace std;
void test1(sw::redis::Redis &redis)
{
    redis.flushall();
    // set的使用
    redis.set("key1", "1");
    redis.set("key2", "2");
    redis.set("key3", "3");
    redis.set("key4", "4");
    // get的使用
    auto value1 = redis.get("key1");
    cout << "value1=" << value1.value() << endl;

    auto value2 = redis.get("key2");
    cout << "value2=" << value2.value() << endl;

    auto value3 = redis.get("key3");
    cout << "value3=" << value3.value() << endl;
    auto value4 = redis.get("key4");
    cout << "value4=" << value4.value() << endl;

    auto value5 = redis.get("key5");
    if (value5) // optional 可以隐式转化为bool类型
    {
        cout << "value5=" << value5.value() << endl;
    }
    redis.exists({""});
}

void test2(sw::redis::Redis &redis)
{
    redis.flushall();
    redis.set("key", "111");
    redis.set("key2", "222");
    redis.set("key3", "333");
    auto ret = redis.exists("key");
    cout << ret << endl;
    ret = redis.exists({"key", "key1", "key2"});
    cout << ret << endl;
}

void test3(sw::redis::Redis &redis)
{
    redis.flushall();
    redis.set("key", "111");
    redis.set("key2", "222");
    redis.set("key3", "333");
    auto ret = redis.del("key");
    cout << ret << endl;
    ret = redis.del({"key", "key1", "key2"});
    cout << ret << endl;
}

void test4(sw::redis::Redis &redis)
{
    // keys
    redis.flushall();
    redis.set("key1", "111");
    redis.set("key2", "222");
    redis.set("key3", "333");
    redis.set("key4", "444");
    redis.set("key5", "555");
    list<string> container;
    std::back_insert_iterator<list<string>> it(container);
    redis.keys("*", it);
    PrintContainer(container);
}
void test5(sw::redis::Redis &redis)
{
    redis.flushall();
    redis.set("key", "111");
    redis.expire("key", chrono::seconds(10));
    this_thread::sleep_for(2s);
    auto value = redis.ttl("key");
    cout << value << endl;
}

void test6(sw::redis::Redis &redis)
{
    redis.flushall();
    redis.set("Key", "1");
    string reslut = redis.type("Key");
    cout << reslut << endl;

    redis.hset("key1", make_pair<string, string>("hash", "1"));
    cout << redis.type("key1") << endl;

    redis.lpush("key2", "2");
    cout << redis.type("key2") << endl;

    redis.sadd("key3", "3");
    cout << redis.type("key3") << endl;

    redis.zadd("key4", "吕布", 98);
    cout << redis.type("key4") << endl;
}
int main()
{
    sw::redis::Redis redis("tcp://127.0.0.1:6379");
    // test1(redis);
    // test2(redis);
    // test3(redis);
    // test4(redis);
    // test5(redis);
    test6(redis);
    return 0;
}